
简单又完整的APK签名图形化工具
特点
- 上手简单: 面向小白用户,只需要导 APK 就可以直接签名。
- 功能完整: 面向资深用户,提供了谷歌官方提供的所有签名参数支持。
- 兼容性好: 支持多种操作系统和架构,包括 Windows、Linux、MacOS 等。
- 饼画的圆: 初期项目,有许多不完善的地方,给大佬们留下足够的扩展空间。
Welcome to the pit!
简单又完整的APK签名图形化工具
在一次偶然中,我从一个角落中找到了这台小米平板 4 Plus(是的,现在正在用这个平板写这篇文章)。在找到她的时候,她已经奄奄一息了,即使按动那脆弱的电源键也没有任何响应。
在给她补充能源后,她又恢复了往日的生机。这台平板在 2018 年发布,仅在 2020 年就停止了官方维护,搭载着骁龙 660 的身体和 Android 8.1 的系统并无法在现在正常的使用。如何让她焕发生机,就成了这期文章的主题了。
目前来说,换一个 Soc 很困难,但是对于老款小米来说的话,解锁 Bootloader 应该是个轻松的事情。系统搭载着基于 Android 8.1 的 MIUI 10 ,只需要在登录小米账号后等 7 天就行。我们在这期间测试了这个系统能否在现在的环境下正常使用。
在设置 Home Assistant 的反向代理后很容易遇到400: Bad Request
或者Unable to connect to Home Assistant.
的问题,经过我研究后找到了一个完美且暴力的方案,就是放行所有 IP 地址。
在<Home Assistant目录>/config/configuration.yaml
里添加这么一段内容并重启 Home Assistant.
http:
use_x_forwarded_for: true
trusted_proxies:
- 0.0.0.0/0
众所周知,我们国产模型DeepSeek
大过年的给美股来了几下子,在我们过年的时候让洋人过不了一个安稳年(滑稽)。直到我写这篇帖子的时候,DeepSeek 的部分服务仍然处于一个不可用的状态。
本着增强动手能力(整活)的心态,我决定在我的手机上安装一个deepseek-r1
模型。由于在电脑上安装过于简单,将不再赘述。
在部署 NAS 后,通常我们会使用 SMB(Server Message Block)服务来备份设备。然而,由于安全限制,公网通常无法直接访问 445 端口,因此需要修改 SMB 服务的端口。然而,Windows 默认只能连接 445 端口的 SMB 服务,且该端口是硬编码的。为了解决这个问题,我们可以通过端口映射的方式来实现连接。
为了通过本地环回地址映射到非标准端口的 SMB 服务,首先需要停止并禁用本机的 SMB 服务。
打开 Windows 服务管理器:
Win + R
,输入 services.msc
,然后按回车。Server
服务。停止并禁用 Server
服务:
Server
服务,选择 停止
。属性
,将启动类型设置为 禁用
。重启电脑以确保更改生效。
由于脚本迭代太多,之前的教程已经完全不适合现在的脚本的,给使用脚本的用户带来了些许障碍。我们特此根据现有版本的脚本v4.0.x
重新撰写教程。
在写新版脚本之前,我们在 QQ 群里里统计了 Android 用户的版本占比,并根据统计的结果作为优化侧重点。,根据统计结果,我们侧重于高版本 Android 的优化,并推出了导致 proot 容器闪退的集成解决方案,使用户更容易的使用脚本。
建议在安装之前,先粗略的阅读一遍教程和文章底部的文档,方便在遇到问题是及时定位到相应的文档。
from Crypto.Cipher import ChaCha20_Poly1305
import os
key = os.urandom(32)
nonce = os.urandom(12)
with open('flag.txt', 'rb') as f:
plaintext = f.read()
cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce)
ct, tag = cipher.encrypt_and_digest(plaintext)
print(f"Encrypted Flag: {ct.hex()}")
print(f"Tag: {tag.hex()}")
print(f"Nonce: {nonce.hex()}")
with open('key.txt', 'w') as key_file:
key_file.write(key.hex())
打开代码附件,映入眼帘的就是标记好的backdoor
// backdoor
app.post("/UserList", (req, res) => {
user = req.body;
const blacklist = ["\\u", "outputFunctionName", "localsName", "escape"];
const hacker = JSON.stringify(user);
for (const pattern of blacklist) {
if (hacker.includes(pattern)) {
res.status(200).json({ message: "hacker!" });
return;
}
}
copy(users, user);
res.status(200).json(user);
});
打开题目环境后会提示
根据题目源码,我们可以找到路径。
app.get("/login", function (req, res) {
res.render("login");
});
<?php
error_reporting(0);
if (isset($_GET['cmd'])) {
$cmd = $_GET['cmd'];
if (preg_match("/flag|cat|ls|echo|php|bash|sh|more| |less|head|tail|[\|\&\>\<]|eval|system|exec|popen|shell_exec/i", $cmd)) {
die("Blocked by security filter!");
} else {
eval($cmd);
}
} else {
highlight_file(__FILE__);
}
?>